/**
 * src/helpers/cart.ts
 * 将商品添加到购物车
 */

import { Product } from "../store/models/product";

// 创建 CartItem 接口继承 Product 接口数据类型并新增一个 count 数据：代表当前商品数量
export interface CartItem extends Product {
    count: number
}

export const addItem = (item: Product, next: () => void) => {
    let cart: CartItem[] = []
    if (typeof window !== 'undefined') {
        // 如果 window 存在 判断本地中是否已经有购物车数据
        if (localStorage.getItem('cart')) {
            cart = JSON.parse(localStorage.getItem('cart')!)
        }
        // 将新数据添加到数组中
        cart.push({
            ...item,
            count: 1
        })
    }

    // 去重
    cart = Array.from(new Set(cart.map(item => item._id))).map(item => {
        return cart.find(product => product._id === item)
    }) as CartItem[]

    // 保存在缓存
    localStorage.setItem('cart', JSON.stringify(cart))

    // 调用回调函数
    next()
}

/**
 * 获取本地购物车数据
 */

export const getCart = () => {
    if (typeof window !== 'undefined') {
        if (localStorage.getItem('cart')) {
            return JSON.parse(localStorage.getItem('cart')!) as CartItem[]
        }
    }

    return []
}

/**
 * 更改购物车中商品的数量
 */

export const updateItem = (productId: string, count: number) => {
    let cart: CartItem[] = []
    if (typeof window !== 'undefined') {
        // 如果 window 存在 判断本地中是否已经有购物车数据
        if (localStorage.getItem('cart')) {
            cart = JSON.parse(localStorage.getItem('cart')!)
        }
        // 找到数组中对应的商品并修改商品数量
        cart.forEach((item, index) => {
            if (item._id === productId) {
                cart[index].count = count
            }
        })
    }
    // 保存在缓存
    localStorage.setItem('cart', JSON.stringify(cart))

    return cart
}

/**
 * 删除购物车中的商品
 */

export const deleteItem = (productId: string) => {
    let cart: CartItem[] = []
    if (typeof window !== 'undefined') {
        // 如果 window 存在 判断本地中是否已经有购物车数据
        if (localStorage.getItem('cart')) {
            cart = JSON.parse(localStorage.getItem('cart')!)
        }
        // 找到数组中对应的商品并删除
        cart.forEach((item, index) => {
            if (item._id === productId) {
                cart.splice(index, 1)
            }
        })
    }
    // 保存在缓存
    localStorage.setItem('cart', JSON.stringify(cart))

    return cart
}

/**
 * 获取商品数量
 */

export const itemCount = () => {
    if (typeof window !== 'undefined') {
        // 如果 window 存在 判断本地中是否已经有购物车数据
        if (localStorage.getItem('cart')) {
            return JSON.parse(localStorage.getItem('cart')!).length
        }
    }
    return 0
}